62. 不同路径

62. 不同路径

Similar Question

Solution Tips

方案一: 图论 Dfs

这道题目,刚一看最直观的想法就是用图论里的深搜,来枚举出来有多少种路径。

方案二: 动态规划

var uniquePaths = function(m, n) {
    // 1. dp[i][j] 代表到达当前位置的可能 path 数量
    // 因为只有两个方向可以走, 往右走, 就等于左边的格子的 path
    // 往下走就等于上面的格子的 path
    // 2. dp[i][j] = dp[i -1][j] + dp[i][j - 1]
    // 3. dp[0][0] = 1
    // dp[1][0] = 1
    // dp[0][1] = 1
    // 4. 从左到右, 从上到下即可
    // 这一题感觉通项公式是最简单的
    const dp = Array(m).fill().map(item => Array(n))

    for (let i = 0; i < m; ++i) {
        dp[i][0] = 1
    }

    for (let i = 0; i < n; ++i) {
        dp[0][i] = 1
    }

    for (let i = 1; i < m; ++i) {
        for (let j = 1; j < n; ++j) {
            dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
        }
    }
    return dp[m - 1][n - 1]
};

滚动数组优化

var uniquePaths = function(m, n) {
    let dp = new Array(m).fill(1).map(() => new Array(n).fill(1));
    // dp[i][j] 表示到达(i,j) 点的路径数
    for (let i=1; i<m; i++) {
        for (let j=1; j< n;j++) {
            dp[i][j]=dp[i-1][j]+dp[i][j-1];
        }
    }
    return dp[m-1][n-1];

};

方案三: 数论 - 组合

pCRlEwj.png

var uniquePaths = function(m, n) {
    let ans = 1;
    for (let x = n, y = 1; y < m; ++x, ++y) {
        ans = Math.floor(ans * x / y);
    }
    return ans;
};